#include <iostream>
using namespace std;
#include <string.h>
#define USER "USER"
#define MYPWD "PWD"
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

// static int num = 100;

#define NUM 5
typedef void (*func_t)();
func_t handlertask[NUM];
void test1()
{
    cout << "test1" << endl;
}
void test2()
{
    cout << "test2" << endl;
}
void test3()
{
    cout << "test3" << endl;
}
void test4()
{
    cout << "test4" << endl;
}
void test5()
{
    cout << "test5" << endl;
}

void loadTask(){
    memset(handlertask,0,sizeof(handlertask));
    handlertask[0] = test1;
    handlertask[1] = test2;
    handlertask[2] = test3;
    handlertask[3] = test4;
    handlertask[4] = test5;


}

int main(int argc, char *argv[], char *env[])
{



    
    // pid_t id = fork();
    // if (id == 0)
    // {
    //     int cnt = 0;
    //     while (true)
    //     {
    //         printf("子进程:%d\n", getpid());
    //         cnt++;
    //         sleep(1);
    //         if (cnt == 5)
    //         {
    //             // int s = 5/0;

    //             exit(1);
    //         }
    //     }
    // }

    // // 轮询
    // while (1)
    // {
    //     int status = 0;
    //     pid_t ret = waitpid(id, &status, WNOHANG);
    //     if (ret == 0)
    //     {
    //         printf("等待成功，但是子进程没有退出\n");
    //         loadTask();
    //         // 回调
    //         for (int i = 0; i < NUM; i++)
    //         {
    //             handlertask[i]();
    //         }
    //     }
    //     else
    //     {
    //         printf("等待成功，子进程已经退出，pid:%d:exit signal:%d:exit code:%d", getpid(), (status & 0x7F), (status >> 8) & 0xFF);
    //         break;
    //     }

    //     sleep(1);
    // }

    // 阻塞式等待
    // sleep(5);
    // int status = 0;
    // pid_t ret = waitpid(id, &status, 0);
    // if (ret == id)
    // {
    //     cout << "等待成功" << ret << endl;
    //     cout << "exit signal:" << (status & 0x7F) << ",exit code:" << ((status >> 8) & 0xFF) << endl;

    // }
    // else if (ret < 0)
    // {
    //     perror("waitpid\n");
    // }

    // pid_t id = fork();
    // if (id == 0)
    // {
    //     int cnt = 10;
    //     while (true)
    //     {
    //         cnt--;
    //         cout << "子进程id:" << getpid() << "pid:" << getppid() << "num:" << num << "&num" << &num << endl;
    //         sleep(1);
    //         if (cnt == 5)
    //         {
    //             num = 300;
    //             cout << "子进程将值改变" << endl;
    //             break;
    //         }
    //     }
    // }
    // while (true)
    // {
    //     cout << "父进程id:" << getpid() << "pid:" << getppid() << "num:" << num << "&num" << &num << endl;
    //     sleep(1);
    // }

    //  for(int i =0;env[i];i++){
    //     printf("%d:%s\n",i,env[i]);
    // }

    // extern char** environ;
    // for(int i =0;environ[i];i++){
    //     printf("%d:%s\n",i,environ[i]);
    // }

    // for (int i = 0; i < argc; i++)
    // {
    //     printf("argv[%d]:%s\n",i,argv[i]);
    // }

    // printf("%s",getenv(MYPWD));

    // char* name = getenv(USER);
    // if(strcmp(name,"root") == 0){
    //     cout<<name<<endl;
    // }else{
    //     cout<<"权限不足"<<endl;
    // }
    return 0;
}